<?php
/**
 * タイニーリンク
 */

/**
 * タイニーリンク
 * @author admin
 *
 */
class lib_tinylink
{
	const FILE_NAME = 'tynylink.txt';
	
	protected $_dicTinyLink;
	
	/**
	 * コンストラクタ
	 */
	public function __construct()
	{
		$this->_dicTinyLink = array();
		if (file_exists(dirname(__FILE__). '/' . self::FILE_NAME)) {
			$text = file(dirname(__FILE__). '/' . self::FILE_NAME, FILE_IGNORE_NEW_LINES);
			foreach ($text as $line) {
				$divide = explode(',', $line);
				/**フォーメットエラー判定 */
				if (count($divide) < 2) {
					continue;
				}
				$this->_dicTinyLink[$divide[0]] = $divide[1];
			}
		}
	}
	
	/**
	 * 実URLを返す
	 * @param unknown_type $url
	 */
	public function getReal()
	{
		$idTiny = '';
		if (isset($_GET['tiny'])) {
			$idTiny = $_GET['tiny'];
		}
		if ($idTiny == '') {
			if (isset($_POST['tiny'])) {
				$idTiny = $_POST['tiny'];
			}
		}
		if ($idTiny == '') {
			return FALSE;
		}
		
		if (!isset($this->_dicTinyLink[$idTiny])) {
			return FALSE;
		}
		$this->_checkParamMadia();
		return $this->_dicTinyLink[$idTiny];
	}
	
	/**
	 * GETパラメータキー'media'に'print'が設定されていたら、
	 * セッションに保存する
	 */
	protected function _checkParamMadia()
	{
		if (!isset($_SESSION)){
			session_start();
		}
		if (isset($_SESSION['media'])) {
			if ($_SESSION['media'] == 'print') {
				unset($_SESSION['media']);
			}
		}
		if (empty($_GET['media'])) {
			return;
		}
		if ($_GET['media'] == 'print') {
			$_SESSION['media'] = 'print';
		}
	}
	
	/**
	 * 自分自身のURLを返す。
	 */
	public static function getSelfUrl()
	{
		if ( isset($_SERVER['HTTPS']) and $_SERVER['HTTPS'] == 'on' )
		{
			$protocol = 'https://';
		}
		else
		{
			$protocol = 'http://';
		}
		
		$url  = $protocol.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
		return $url;
	}
	
	/**
	 * タイニーリンクを返す
	 * @param $url
	 */
	public function getTiny($url)
	{
		$parsedUrl = parse_url($url);
		$ret = array_search($url, $this->_dicTinyLink);
		/** 保存済み */
		if ( $ret !== FALSE) {
			/***タイニーURLを組み立てる */
			$resultTinyUrl = $this->_buildTinyUrl($parsedUrl, $ret);
			return $resultTinyUrl;
		}
		
		/**
		 * タイニーリンク未作成ページ 
		 */
		$countTinyLink = count($this->_dicTinyLink);
		/** @var リンクID候補 */
		$newLinkId = $this->_createKey($countTinyLink);
		/** 割り当て可能ＩＤ検出まで回す */
		while (array_search($newLinkId, $this->_dicTinyLink) !== FALSE) {
			$countTinyLink ++;
			$newLinkId = $this->_createKey($countTinyLink);
		}
		/***タイニーURLを組み立てる */
		$resultTinyUrl = $this->_buildTinyUrl($parsedUrl, $newLinkId);
		/***URLを辞書に登録する */
		$this->_dicTinyLink[$newLinkId] = $url;
		$this->_saveToFile();
		return $resultTinyUrl;
	}
	
	/**
	 * タイニーURLを組たてる
	 * @param $buildParcedUrl
	 */
	protected function _buildTinyUrl($parsedUrl, $newLinkId)
	{
		$buildParcedUrl = $parsedUrl;
		$buildParcedUrl['query'] = 'tiny=' . $newLinkId;
		$resultTinyUrl = self::buildUrl($buildParcedUrl);
		return $resultTinyUrl;
	}
	
	/**
	 * 実URLを検索する
	 * @param $url
	 */
	protected function _serachReal($url)
	{
		
	}
	
	/**
	 * シリアライズしてファイルに保存する
	 */
	protected function _saveToFile()
	{
		$txt = '';
		foreach ($this->_dicTinyLink as $key=>$url) {
			if ($txt != '') {
				$txt .= "\r\n";
			} 
			$txt .= $key . ',' . $url;
		}
		file_put_contents(dirname(__FILE__). '/' . self::FILE_NAME, $txt);
	}
	
	const KEY_SCHEME= 'scheme';
	const KEY_HOST= 'host';
	const KEY_PORT= 'port';
	const KEY_USER= 'user';
	const KEY_PASS= 'pass';
	const KEY_PATH= 'path';
	const KEY_QUERY= 'query';
	const KEY_FRAGMENT= 'fragment';
	
	/**
	 * URLを組み立てる
	 * @param $aryParcedUrl
	 */
	public static function buildUrl($aryParcedUrl)
	{
		$resultUrl = '';
		if (!empty($aryParcedUrl[self::KEY_SCHEME])) {
			$resultUrl .= $aryParcedUrl[self::KEY_SCHEME].'://';
		} else {
			$resultUrl .= 'http://';
		}
		if (!empty($aryParcedUrl[self::KEY_HOST])) {
			$resultUrl .= $aryParcedUrl[self::KEY_HOST];
		} else {
			$resultUrl .= $_SERVER['HTTP_HOST'];
		}
		if (!empty($aryParcedUrl[self::KEY_PORT])) {
			$resultUrl .= ':' . $aryParcedUrl[self::KEY_PORT];
		}
		if (!empty($aryParcedUrl[self::KEY_PATH])) {
			$resultUrl .= $aryParcedUrl[self::KEY_PATH];
		}
		if (!empty($aryParcedUrl[self::KEY_QUERY])) {
			$resultUrl .= '?' . $aryParcedUrl[self::KEY_QUERY];
		}
		if (!empty($aryParcedUrl[self::KEY_FRAGMENT])) {
			$resultUrl .= '#' . $aryParcedUrl[self::KEY_FRAGMENT];
		}
		return $resultUrl;
	}
	
	/**
	 * 数値からタイニーリンクキーを生成する
	 */
	protected function _createKey($i)
	{
		$ret = sprintf('%04X', $i);
		return $ret;
	}
}